// Package _2_非递归中序遍历二叉树 main
// @Title _2_非递归中序遍历二叉树
// @Description
// @Author  == 琳琳也叫王木木 ==  2022-01-14 18:18
// @Create  2022-01-14 18:18
package main

import (
	"fmt"
)

/**
核心思路：

每个子树，整棵树，左边界进栈，然后弹出把右子树也进栈

*/

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func main() {
	root := TreeNode{
		1,
		&TreeNode{
			2,
			&TreeNode{
				4,
				nil,
				nil,
			},
			&TreeNode{
				5,
				nil,
				nil,
			},
		},
		&TreeNode{
			3,
			&TreeNode{
				6,
				nil,
				nil,
			},
			&TreeNode{
				7,
				nil,
				nil,
			},
		},
	}
	fmt.Println(noRecRange(&root))
}

//
//  noRecRange
//  @Description: 非递归中序遍历二叉树  左——> 根 -> 右
//  @param root： 二叉树根节点
//  @return []int：先序遍历后的数组
//
func noRecRange(root *TreeNode) []int {
	if root == nil {
		return nil
	}
	// 创建一个收集数组
	var ans []int
	stack := []*TreeNode{}
	for root != nil || len(stack) > 0 {
		if root != nil {
			stack = append(stack, root)
			root = root.Left
		} else {
			root = stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			ans = append(ans, root.Val)
			root = root.Right
		}
	}
	return ans
}
